modulo11
Otázka od: hlas
29. 4. 2004 13:44
ja som zohnal takuto funkciu,
vrati 0 ak je ucet ok
FUNCTION modulo(CUs:string):integer;
var s1:string[20];
c1, c2, kc,i,j:integer;
BEGIN
j:=length(CUs)+1;
kc:=0;
for i:=1 to j-1 do
begin
j:=j-1; c1:= strtoint(CUs[j]);
if i=1 then kc:=1*c1;
if i=2 then kc:=kc+(2*c1);
if i=3 then kc:=kc+(4*c1);
if i=4 then kc:=kc+(8*c1);
if i=5 then kc:=kc+(5*c1);
if i=6 then kc:=kc+(10*c1);
if i=7 then kc:=kc+(9*c1);
if i=8 then kc:=kc+(7*c1);
if i=9 then kc:=kc+(3*c1);
if i=10 then kc:=kc+(6*c1);
end;
c1:=floor(kc/11); c2:=ceil(kc/11);
kc:=c2-c1;
result:=kc;
END;
Odpovedá: Ing. Pavel Zilinec
29. 4. 2004 5:23
Sice jsou tam jeste nejake specialni fce, ale ty si lehce nahradis za
klasicke ...
procedure ExtractUcet(const AUcet : string; var APredcisli, ACisUctu : string);
var MyPomStr : string;
begin
MyPomStr := ReplaceStr(AUcet, ' ', '');
{Z poslaneho uctu odstranim pomlcku vzadu}
if LeftStr(RightStr(MyPomStr, 4), 1) = '-' then
MyPomStr := LeftStr(MyPomStr, Length(MyPomStr) - 4) + RightStr(MyPomStr,
3);
{Pokud je tam '-', tak je to hned jasne}
if Occurs('-', MyPomStr) > 0 then
begin
APredcisli := LeftStr(MyPomStr, Pos('-', MyPomStr) - 1);
ACisUctu := RightStr(MyPomStr, Length(MyPomStr) - Length(APredcisli) -
1);
end
{Jinak to vezmu podle poctu znaku zprava}
else
begin
ACisUctu := RightStr(MyPomStr, 10);
if Length(MyPomStr) <= 10 then APredcisli := ''
else APredcisli := LeftStr(MyPomStr, Length(MyPomStr) - 10);
end;
{Pokud je neco moc dlouhe, jde o chybu a vse bude nulove}
if (Length(APredcisli) > 6) or (Length(ACisUctu) > 10) then
begin
APredcisli := '';
ACisUctu := '';
end;
{Doplnim zleva nuly}
APredcisli := StrPadL(APredcisli, 6, '0');
ACisUctu := StrPadL(ACisUctu, 10, '0');
end;
function ValidateUcet(const AUcet : string; AHlaseni : Boolean) : Boolean;
const
MyVahy : array [1..10] of Byte = (6, 3, 7, 9, 10, 5, 8, 4, 2, 1);
MyVahyP : array [1..6] of Byte = ( 10, 5, 8, 4, 2, 1);
var
i : Byte;
MyVysledek : Integer;
MyPredcisli, MyCisUctu : string;
begin
Result := True;
if Trim(AUcet) = '' then Exit;
MyVysledek := 0;
{Vytahnu si predcisli a samotne cislo}
ExtractUcet(AUcet, MyPredcisli, MyCisUctu);
{Musi tam byt jen cislice a nesmi to byt prazdne (pak tam byla chybna delka)}
Result := StrToInt64Def(MyPredcisli + MyCisUctu, -1) > 0;
{Kontrola predcisli}
if Result then
begin
for i := 1 to 6 do
MyVysledek := MyVysledek + StrToInt(MyPredcisli[i])*MyVahyP[i];
if MyVysledek mod 11 <> 0 then Result := False;
end;
{Kontrola cisla uctu}
if Result then
begin
for i := 1 to 10 do
MyVysledek := MyVysledek + StrToInt(MyCisUctu[i])*MyVahy[i];
if MyVysledek mod 11 <> 0 then Result := False;
end;
{Pripadna hlaska, pokud to chtel}
if not Result and AHlaseni then
PS_Upoz('', Format(PSApp.LocStr(9002), [AUcet]));
end;
--
ing. Pavel Zilinec
MailTo:zilinec@email.cz
Prog-Soft s.r.o. Plzen
Informacni system pro vyrobce
a distributory napoju
Wednesday, April 28, 2004, 11:13:39 PM, bylo napsano:
h> Neviete niekto poradit s algoritmom, resp. funkciou pre modulo11,
h> kontrola bankoveho uctu?
Odpovedá: Ing. Pavel Zilinec
29. 4. 2004 13:43
To urcite take souhlasi, ale predpokalda to, ze je ucet zadany na
plny pocet mist s uvodnimi nulami a bez pomlcek.
Me fce predpokladaji take spravne zadany ucet, ale napsany s
pripustnymi (!) pomlckami a s moznym (!) vynechanim tech uvodnich nul.
--
ing. Pavel Zilinec
MailTo:zilinec@email.cz
Prog-Soft s.r.o. Plzen
Informacni system pro vyrobce
a distributory napoju
Thursday, April 29, 2004, 1:46:46 PM, bylo napsano:
h> ja som zohnal takuto funkciu,
h> vrati 0 ak je ucet ok
h> FUNCTION modulo(CUs:string):integer;
h> var s1:string[20];
h> c1, c2, kc,i,j:integer;
h> BEGIN
h> j:=length(CUs)+1;
h> kc:=0;
h> for i:=1 to j-1 do
h> begin
h> j:=j-1; c1:= strtoint(CUs[j]);
h> if i=1 then kc:=1*c1;
h> if i=2 then kc:=kc+(2*c1);
h> if i=3 then kc:=kc+(4*c1);
h> if i=4 then kc:=kc+(8*c1);
h> if i=5 then kc:=kc+(5*c1);
h> if i=6 then kc:=kc+(10*c1);
h> if i=7 then kc:=kc+(9*c1);
h> if i=8 then kc:=kc+(7*c1);
h> if i=9 then kc:=kc+(3*c1);
h> if i=10 then kc:=kc+(6*c1);
h> end;
h> c1:=floor(kc/11); c2:=ceil(kc/11);
h> kc:=c2-c1;
h> result:=kc;
h> END;
h> __________ Informace od NOD32 1.742 (20040428) __________
h> Tato zprava byla proverena antivirovym systemem NOD32.
h> http://www.nod32.cz